home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 23
/
Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso
/
Aminet
/
misc
/
emu
/
amiSPIMsrc.lha
/
Tests
/
tt.alu.bare.s
< prev
next >
Wrap
Text File
|
1994-01-19
|
30KB
|
1,844 lines
# SPIM S20 MIPS simulator.
# A torture test for the ALU instructions in the bare SPIM simulator.
# Copyright (C) 1990-1994 James Larus, larus@cs.wisc.edu.
# ALL RIGHTS RESERVED.
#
# SPIM is distributed under the following conditions:
#
# You may make copies of SPIM for your own use and modify those copies.
#
# All copies of SPIM must retain my name and copyright notice.
#
# You may not sell SPIM or distributed SPIM in conjunction with a commerical
# product or service without the expressed written consent of James Larus.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE.
#
# $Header: /home/primost/larus/Software/SPIM/Tests/RCS/tt.alu.bare.s,v 1.5 1994/01/19 21:30:43 larus Exp larus $
# Adapted by Anne Rogers <amr@blueline.Princeton.EDU> from tt.le.s.
# Run -bare -notrap.
# IMPORTANT!!!
# This file only works on little-endian machines.
#
# Test ALU instructions.
# WARNING: This code is not relocatable. DO NOT add instructions without
# changing test code for JAL, JALR, BGEZAL, BLTZAL. Add new "data" statements
# only at after "Passed all tests\n".
.data
saved_ret_pc: .word 0 # Holds PC to return from main
sm: .asciiz "Failed "
.text
# Standard startup code. Invoke the routine main with no arguments.
.globl __start
__start: jal main
addu $0 $0 $0 # Nop
addiu $2 $0 10
syscall # syscall 10 (exit)
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
.globl main
main:
lui $4 0x1000
sw $31 0($4)
#
# Try modifying R0
#
addi $0 $0 1
#
# Now, test each instruction
#
.data
add_: .asciiz "Testing ADD\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 add_
lui $a0, 0x1000
ori $a0 $a0 0xd
syscall
addi $2 $0 1
addi $3 $0 -1
add $4 $0 $0
bne $4 $0 fail
addu $0 $0 $0 # Nop
add $4 $0 $2
bne $4 $2 fail
addu $0 $0 $0 # Nop
add $4 $4 $3
bne $4 $0 fail
addu $0 $0 $0 # Nop
.data
addi_: .asciiz "Testing ADDI\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 addi_
lui $a0, 0x1000
ori $a0 $a0 0x1a
syscall
addi $2 $0 1
addi $4 $0 0
bne $4 $0 fail
addu $0 $0 $0 # Nop
addi $4 $0 1
bne $4 $2 fail
addu $0 $0 $0 # Nop
addi $4 $4 -1
bne $4 $0 fail
.data
addiu_: .asciiz "Testing ADDIU\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 addiu_
lui $a0, 0x1000
ori $a0 $a0 0x28
syscall
addi $2 $0 1
addiu $4 $0 0
bne $4 $0 fail
addu $0 $0 $0 # Nop
addiu $4 $0 1
bne $4 $2 fail
addu $0 $0 $0 # Nop
addiu $4 $4 -1
bne $4 $0 fail
addu $0 $0 $0 # Nop
lui $2 0x3fff
ori $2 $2 0xffff
addiu $2 $2 101
.data
addu_: .asciiz "Testing ADDU\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 addu_
lui $a0, 0x1000
ori $a0 $a0 0x37
syscall
addi $2 $0 1
addi $3 $0 -1
addu $4 $0 $0
bne $4 $0 fail
addu $0 $0 $0 # Nop
addu $4 $0 $2
bne $4 $2 fail
addu $0 $0 $0 # Nop
addu $4 $4 $3
bne $4 $0 fail
addu $0 $0 $0 # Nop
lui $2 0x3fff
ori $2 $2 0xffff
addu $2 $2 $2
.data
and_: .asciiz "Testing AND\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 and_
lui $a0, 0x1000
ori $a0 $a0 0x37
syscall
addi $2 $0 1
addi $3 $0 -1
and $4 $0 $0
bne $4 $0 fail
addu $0 $0 $0 # Nop
and $4 $2 $2
beq $4 $0 fail
addu $0 $0 $0 # Nop
and $4 $2 $3
bne $4 $2 fail
.data
andi_: .asciiz "Testing ANDI\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 andi_
lui $a0, 0x1000
ori $a0 $a0 0x52
syscall
addi $2 $0 1
addi $3 $0 -1
addi $5 $0 -1
andi $4 $0 0
bne $4 $0 fail
addu $0 $0 $0 # Nop
and $4 $2 1
beq $4 $0 fail
addu $0 $0 $0 # Nop
and $4 $2 $5
bne $4 $2 fail
addu $0 $0 $0 # Nop
and $4 $3 $5
bne $4 $3 fail
addu $0 $0 $0 # Nop
.data
beq_: .asciiz "Testing BEQ\n"
.text
add $v0 $0 4 # syscall 4 (print_str)
# la $a0 beq_
lui $a0, 0x1000
ori $a0 $a0 0x60
syscall
add $2 $0 -1
add $3 $0 1
beq $0 $0 l1
# j fail
addu $0 $0 $0 # Nop
l1: beq $2 $2 l2
# j fail
addu $0 $0 $0 # Nop
l2: beq $3 $2 fail
addu $0 $0 $0 # Nop
addi $2 $0 3
l2_1: sub $2 $2 $3
bne $2 $0 l2_1
addu $0 $0 $0 # Nop
.data
bgez_: .asciiz "Testing BGEZ\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bgez_
lui $a0, 0x1000
ori $a0 $a0 0x6d
syscall
addi $2 $0 -1
addi $3 $0 1
bgez $0 l3
addu $0 $0 $0 # Nop
j fail
l3: bgez $3 l4
addu $0 $0 $0 # Nop
j fail
l4: bgez $2 fail
addu $0 $0 $0 # Nop
.data
bgtz_: .asciiz "Testing BGTZ\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bgtz_
lui $a0, 0x1000
ori $a0 $a0 0x7b
syscall
addi $2 $0 -1
addi $3 $0 1
bgtz $0 fail
addu $0 $0 $0 # Nop
l7: bgtz $3 l8
addu $0 $0 $0 # Nop
j fail
l8: bgtz $2 fail
addu $0 $0 $0 # Nop
.data
blez_: .asciiz "Testing BLEZ\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 blez_
lui $a0, 0x1000
ori $a0 $a0 0x89
syscall
addi $2 $0 -1
addi $3 $0 1
blez $0 l9
addu $0 $0 $0 # Nop
j fail
l9: blez $2 l10
addu $0 $0 $0 # Nop
j fail
l10: blez $3 fail
addu $0 $0 $0 # Nop
.data
bltz_: .asciiz "Testing BLTZ\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bltz_
lui $a0, 0x1000
ori $a0 $a0 0x97
syscall
addi $2 $0 -1
addi $3 $0 1
bltz $0 fail
addu $0 $0 $0 # Nop
l11: bltz $2 l12
addu $0 $0 $0 # Nop
j fail
l12: bltz $3 fail
addu $0 $0 $0 # Nop
.data
bne_: .asciiz "Testing BNE\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bne_
lui $a0, 0x1000
ori $a0 $a0 0xa5
syscall
addi $2 $0 -1
addi $3 $0 1
bne $0 $0 fail
addu $0 $0 $0 # Nop
bne $2 $2 fail
addu $0 $0 $0 # Nop
bne $3 $2 l16
addu $0 $0 $0 # Nop
l16:
addu $0 $0 $0 # Nop
.data
j_: .asciiz "Testing J\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 j_
lui $a0, 0x1000
ori $a0 $a0 0xb2
syscall
j l17
j fail
l17: addu $0 $0 $0 # Nop
.data
lb_: .asciiz "Testing LB\n"
# lb2_: .asciiz "Expect a address error exceptions:\n "
lbd_: .byte 1, -1, 0, 128
lbd1_: .word 0x76543210, 0xfedcba98
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lb_
lui $a0, 0x1000
ori $a0 $a0 0xbd
syscall
# la $2 lbd_
lui $2, 0x1000
ori $2 $2 0xc9
lb $3 0($2)
addu $4 $0 1
bne $3 $4 fail
lb $3 1($2)
addi $4 $0 -1
bne $3 $4 fail
lb $3 2($2)
addu $0 $0 $0 # Nop
bne $3 $0 fail
lb $3 3($2)
lui $4 0xffff
ori $4 0xff80
bne $3 $4 fail
# la $t0 lbd1_
lui $t0, 0x1000
ori $t0 $t0 0xd0
lb $t1 0($t0)
addi $4 $0 0x10
bne $t1 $4 fail
lb $t1 1($t0)
addi $4 $0 0x32
bne $t1 $4 fail
lb $t1 2($t0)
addi $4 $0 0x54
bne $t1 $4 fail
lb $t1 3($t0)
addi $4 $0 0x76
bne $t1 $4 fail
lb $t1 4($t0)
lui $4 0xffff
addi $4 $0 0xff98
bne $t1 $4 fail
lb $t1 5($t0)
lui $4 0xffff
addi $4 $0 0xffba
bne $t1 $4 fail
lb $t1 6($t0)
lui $4 0xffff
addi $4 $0 0xffdc
bne $t1 $4 fail
lb $t1 7($t0)
lui $4 0xffff
addi $4 $0 0xfffe
bne $t1 $4 fail
# li $v0 4 # syscall 4 (print_str)
# la $a0 lb2_
# syscall
#
# lb $3 1000000($sp)
.data
lbu_: .asciiz "Testing LBU\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lbu_
lui $a0, 0x1000
ori $a0 $a0 0xd8
syscall
# la $2 lbd_
lui $2, 0x1000
ori $2 $2 0xc9
lbu $3 0($2)
addi $4 $0 1
bne $3 $4 fail
lbu $3 1($2)
addi $4 $0 0xff
bne $3 $4 fail
lbu $3 2($2)
addu $0 $0 $0 # Nop
bne $3 $0 fail
lbu $3 3($2)
addu $4 $0 128
bne $3 $4 fail
# la $t0 lbd1_
lui $t0, 0x1000
ori $t0 $t0 0xd0
lbu $t1 0($t0)
addi $4 $0 0x10
bne $t1 $4 fail
lbu $t1 1($t0)
addi $4 $0 0x32
bne $t1 $4 fail
lbu $t1 2($t0)
addi $4 $0 0x54
bne $t1 $4 fail
lbu $t1 3($t0)
addi $4 $0 0x76
bne $t1 $4 fail
lbu $t1 4($t0)
addi $4 $0 0x98
bne $t1 $4 fail
lbu $t1 5($t0)
addi $4 $0 0xba
bne $t1 $4 fail
lbu $t1 6($t0)
addi $4 $0 0xdc
bne $t1 $4 fail
lbu $t1 7($t0)
addi $4 $0 0xfe
bne $t1 $4 fail
addu $0 $0 $0 # Nop
# Causes an exception -- do later.
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lb2_
# syscall
#
# lbu $3 1000000($sp)
.data
lh_: .asciiz "Testing LH\n"
#lh2_: .asciiz "Expect two address error exceptions:\n "
lhd_: .half 1, -1, 0, 0x8000
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh_
lui $a0, 0x1000
ori $a0 $a0 0xe5
syscall
# la $2 lhd_
lui $2, 0x1000
ori $2 $2 0xf2
lh $3 0($2)
addi $4 $0 1
bne $3 $4 fail
lh $3 2($2)
addi $4 $0 -1
bne $3 $4 fail
lh $3 4($2)
addi $4 $0 0
bne $3 $4 fail
lh $3 6($2)
lui $4 0xffff
ori $4 $4 0x8000
bne $3 $4 fail
addu $0 $0 $0 # Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh2_
# syscall
#
# lh $3 1000000($sp)
# lh $3 1000001($sp)
.data
lhu_: .asciiz "Testing LHU\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lhu_
lui $a0, 0x1000
ori $a0 $a0 0xfa
syscall
# la $2 lhd_
lui $2, 0x1000
ori $2 $2 0xf2
lhu $3 0($2)
addi $4 $0 1
bne $3 $4 fail
lhu $3 2($2)
ori $4 $0 0xffff
bne $3 $4 fail
lhu $3 4($2)
addi $4 $0 0
bne $3 $4 fail
lhu $3 6($2)
ori $4 $0 0x8000
bne $3 $4 fail
addu $0 $0 $0 #Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh2_
# syscall
#
# lhu $3 1000000($sp)
# lhu $3 1000001($sp)
.data
lui_: .asciiz "Testing LUI\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lui_
lui $a0, 0x1000
ori $a0 $a0 0x107
syscall
lui $2 0
bne $2 $0 fail
lui $2 1
srl $2 $2 16
addiu $2 $2 -1 # Don't do compare directly since it uses LUI
bne $2 $0 fail
lui $2 1
andi $2 $2 0xffff
bne $2 $0 fail
lui $2 -1
srl $2 $2 16
addiu $2 $2 1
andi $2 $2 0xffff
bne $2 $0 fail
addu $0 $0 $0 #Nop
.data
lw_: .asciiz "Testing LW\n"
lwd_: .word 1, -1, 0, 0x8000000
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lw_
lui $a0, 0x1000
ori $a0 $a0 0x114
syscall
# la $2 lwd_
lui $2, 0x1000
ori $2 $2 0x120
lw $3 0($2)
addi $4 $0 1
bne $3 $4 fail
lw $3 4($2)
addi $4 $0 -1
bne $3 $4 fail
lw $3 8($2)
addi $4 $0 0
bne $3 $4 fail
lw $3 12($2)
lui $4 0x800
ori $4 $4 0x0000
bne $3 $4 fail
add $2 $2 12
lw $3 -12($2)
addi $4 $0 1
bne $3 $4 fail
lw $3 -8($2)
addi $4 $0 -1
bne $3 $4 fail
lw $3 -4($2)
addi $4 $0 0
bne $3 $4 fail
lw $3 0($2)
lui $4 0x800
ori $4 $4 0x0000
bne $3 $4 fail
addu $0 $0 $0 #Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh2_
# syscall
#
# lw $3 1000000($sp)
# lw $3 1000001($sp)
.data
lwl_: .asciiz "Testing LWL\n"
.align 2
lwld_: .byte 0 1 2 3 4 5 6 7
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lwl_
lui $a0, 0x1000
ori $a0 $a0 0x130
syscall
# la $2 lwld_
lui $2, 0x1000
ori $2 $2 0x140
addu $3 $0 $0 # Move $3 $0
lwl $3 0($2)
addi $4 $0 0
bne $3 $4 fail
addu $3 $0 $0 # Move $3 $0
lwl $3 1($2)
lui $4 0x0100
ori $4 $4 0x0000
bne $3 $4 fail
addi $3 $0 5
lwl $3 1($2)
lui $4 0x0100
ori $4 $4 0x0005
bne $3 $4 fail
addu $3 $0 $0 # Move $3 $0
lwl $3 2($2)
lui $4 0x0201
ori $4 $4 0x0000
bne $3 $4 fail
addi $3 $0 5
lwl $3 2($2)
lui $4 0x0201
ori $4 $4 0x0005
bne $3 $4 fail
addu $3 $0 $0 # Move $3 $0
lwl $3 3($2)
lui $4 0x0302
ori $4 $4 0x0100
bne $3 $4 fail
addi $3 $0 5
lwl $3 3($2)
lui $4 0x0302
ori $4 $4 0x0100
bne $3 $4 fail
addu $0 $0 $0 # Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh2_
# syscall
#
# lwl $3 1000000($sp)
# lwl $3 1000001($sp)
.data
lwr_: .asciiz "Testing LWR\n"
.align 2
lwrd_: .byte 0 1 2 3 4 5 6 7
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lwr_
lui $a0, 0x1000
ori $a0 $a0 0x148
syscall
# la $2 lwrd_
lui $2, 0x1000
ori $2 $2 0x158
lui $3 0x0000
ori $3 $3 0x0500
lwr $3 0($2)
lui $4 0x0302
ori $4 $4 0x0100
bne $3 $4 fail
addu $3 $0 $0 # Move $3 $0
lwr $3 1($2)
lui $4 0x0003
ori $4 $4 0x0201
bne $3 $4 fail
lui $3 0x5000
ori $3 $3 0x0000
lwr $3 1($2)
lui $4 0x5003
ori $4 $4 0x0201
bne $3 $4 fail
addu $3 $0 $0 # Move $3 $0
lwr $3 2($2)
ori $4 $0 0x0302
bne $3 $4 fail
lui $3 0x5000
ori $3 $3 0x0000
lwr $3 2($2)
lui $4 0x5000
ori $4 $4 0x0302
bne $3 $4 fail
addu $0 $0 $0 # Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lh2_
# syscall
#
# lwr $3 1000000($sp)
# lwr $3 1000001($sp)
.data
nor_: .asciiz "Testing NOR\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 nor_
lui $a0, 0x1000
ori $a0 $a0 0x160
syscall
addi $2 $0 1
addi $3 $0 -1
nor $4 $0 $0
addi $5 $0 -1
bne $4 $5 fail
nor $4 $2 $2
lui $5 0xffff
ori $5 $5 0xfffe
bne $4 $5 fail
nor $4 $2 $3
bne $4 $0 fail
addu $0 $0 $0 #Nop
.data
or_: .asciiz "Testing OR\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 or_
lui $a0, 0x1000
ori $a0 $a0 0x16d
syscall
addi $2 $0 1
addi $3 $0 -1
or $4 $0 $0
bne $4 $0 fail
or $4 $2 $2
addi $5 $0 1
bne $4 $5 fail
or $4 $2 $3
addi $5 $0 -1
bne $4 $5 fail
addu $0 $0 $0 #Nop
.data
ori_: .asciiz "Testing ORI\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 ori_
lui $a0, 0x1000
ori $a0 $a0 0x179
syscall
addi $2 $0 1
addi $3 $0 -1
ori $4 $0 0
bne $4 $0 fail
ori $4 $2 1
addi $5 $0 1
bne $4 $5 fail
ori $4 $3 -1
lui $5 0xffff
ori $5 $5 0xffff
bne $4 $5 fail
addu $0 $0 $0 #Nop
.data
sb_: .asciiz "Testing SB\n"
#sb2_: .asciiz "Expect a address error exceptions:\n "
.align 2
sbd_: .byte 0, 0, 0, 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sb_
lui $a0, 0x1000
ori $a0 $a0 0x186
syscall
addi $3 $0, 1
# la $2 sbd_
lui $2, 0x1000
ori $2 $2 0x194
sb $3 0($2)
lw $4 0($2)
ori $5 $0 0x1
bne $4 $5 fail
addi $3 $0 2
sb $3 1($2)
lw $4 0($2)
ori $5 $0 0x201
bne $4 $5 fail
addi $3 $0 3
sb $3 2($2)
lw $4 0($2)
lui $5 0x3
ori $5 $5 0x0201
bne $4 $5 fail
addi $3 $0 4
sb $3 3($2)
lw $4 0($2)
lui $5 0x0403
ori $5 $5 0x0201
bne $4 $5 fail
addu $0 $0 $0 #Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sb2_
# syscall
#
# sb $3 1000000($sp)
# RFE tested previously
.data
sh_: .asciiz "Testing SH\n"
#sh2_: .asciiz "Expect two address error exceptions:\n "
.align 2
shd_: .byte 0, 0, 0, 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sh_
lui $a0, 0x1000
ori $a0 $a0 0x198
syscall
addi $3 $0, 1
# la $2 shd_
lui $2, 0x1000
ori $2 $2 0x1a4
sh $3 0($2)
lw $4 0($2)
ori $5 $0 0x1
bne $4 $5 fail
addi $3 $0 2
sh $3 2($2)
lw $4 0($2)
lui $5 0x2
ori $5 $5 0x0001
bne $4 $5 fail
addu $0 $0 $0 #Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sh2_
# syscall
#
# sh $3 1000000($sp)
# sh $3 1000001($sp)
.data
sll_: .asciiz "Testing SLL\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sll_
lui $a0, 0x1000
ori $a0 $a0 0x1a8
syscall
addi $2 $0 1
sll $3 $2 0
ori $4 $0 1
bne $3 $4 fail
sll $3 $2 1
ori $4 $0 2
bne $3 $4 fail
sll $3 $2 16
lui $4 0x1
ori $4 $4 0x0000
bne $3 $4 fail
sll $3 $2 32
ori $4 $0 1
bne $3 $4 fail
addu $0 $0 $0 # Nop
.data
sllv_: .asciiz "Testing SLLV\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sllv_
lui $a0, 0x1000
ori $a0 $a0 0x1b5
syscall
addi $2 $0 1
addi $4 $0 0
sllv $3 $2 $4
ori $5 $0 1
bne $3 $5 fail
addi $4 $0 1
sllv $3 $2 $4
ori $5 $0 2
bne $3 $5 fail
addi $4 $0 16
sllv $3 $2 $4
lui $5 0x1
ori $5 $5 0x0000
bne $3 $5 fail
addi $4 $0 32
sllv $3 $2 $4
ori $5 $0 1
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
slt_: .asciiz "Testing SLT\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 slt_
lui $a0, 0x1000
ori $a0 $a0 0x1c3
syscall
ori $5 $0 1
slt $3 $0 $0
bne $3 $0 fail
addi $2 $0 1
slt $3 $2 $0
bne $3 $0 fail
slt $3 $0 $2
bne $3 $5 fail
addi $2 $0 -1
slt $3 $2 $0
bne $3 $5 fail
slt $3 $0 $2
bne $3 $0 fail
addi $2 $0 -1
addi $4 $0 1
slt $3 $2 $4
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
slti_: .asciiz "Testing SLTI\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 slti_
lui $a0, 0x1000
ori $a0 $a0 0x1d0
syscall
ori $5 $0 1
slti $3 $0 0
bne $3 $0 fail
addi $2 $0 1
slti $3 $2 0
bne $3 $0 fail
slti $3 $0 1
bne $3 $5 fail
addi $2 $0 -1
slti $3 $2 0
bne $3 $5 fail
slti $3 $0 -1
bne $3 $0 fail
addi $2 $0 -1
addi $4 $0 1
slti $3 $2 1
bne $3 $5 fail
slti $3 $4 -1
bne $3 $0 fail
addu $0 $0 $0 # Nop
.data
sltiu_: .asciiz "Testing SLTIU\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sltiu_
lui $a0, 0x1000
ori $a0 $a0 0x1de
syscall
ori $5 $0 1
sltiu $3 $0 0
bne $3 $0 fail
addi $2 $0 1
sltiu $3 $2 0
bne $3 $0 fail
sltiu $3 $0 1
bne $3 $5 fail
addi $2 $0 -1
sltiu $3 $2 0
bne $3 $0 fail
sltiu $3 $0 -1
bne $3 $5 fail
addi $2 $0 -1
addi $4 $0 1
sltiu $3 $2 1
bne $3 $0 fail
sltiu $3 $4 -1
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
sltu_: .asciiz "Testing SLTU\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sltu_
lui $a0, 0x1000
ori $a0 $a0 0x1ed
syscall
ori $5 $0 1
sltu $3 $0 $0
bne $3 $0 fail
addi $2 $0 1
sltu $3 $2 $0
bne $3 $0 fail
sltu $3 $0 $2
bne $3 $5 fail
addi $2 $0 -1
sltu $3 $2 $0
bne $3 $0 fail
sltu $3 $0 $2
bne $3 $5 fail
addi $2 $0 -1
addi $4 $0 1
sltu $3 $2 $4
bne $3 $0 fail
addu $0 $0 $0 # Nop
.data
sra_: .asciiz "Testing SRA\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sra_
lui $a0, 0x1000
ori $a0 $a0 0x1fb
syscall
addi $2 $0 1
sra $3 $2 0
ori $5 $0 1
bne $3 $5 fail
sra $3 $2 1
bne $3 $0 fail
addi $2 $0 0x1000
sra $3 $2 4
ori $5 $0 0x100
bne $3 $5 fail
lui $5 0x8000
ori $5 $5 0x0000
add $2 $0 $5
sra $3 $2 4
lui $5 0xf800
ori $5 $5 0x0000
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
srav_: .asciiz "Testing SRAV\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 srav_
lui $a0, 0x1000
ori $a0 $a0 0x208
syscall
addi $2 $0 1
addi $4 $0 0
srav $3 $2 $4
ori $5 $0 1
bne $3 $5 fail
addi $4 $0 1
srav $3 $2 $4
bne $3 $0 fail
addi $2 $0 0x1000
addi $4 $0 4
srav $3 $2 $4
ori $5 $0 0x100
bne $3 $5 fail
lui $5 0x8000
ori $5 $5 0x0000
add $2 $0 $5
addi $4 $0 4
srav $3 $2 $4
lui $5 0xf800
ori $5 $5 0x0000
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
srl_: .asciiz "Testing SRL\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 srl_
lui $a0, 0x1000
ori $a0 $a0 0x216
syscall
addi $2 $0 1
srl $3 $2 0
ori $5 $0 1
bne $3 $5 fail
srl $3 $2 1
bne $3 $0 fail
addi $2 $0 0x1000
srl $3 $2 4
ori $5 $0 0x100
bne $3 $5 fail
lui $5 0x8000
ori $5 $0 0x0000
add $2 $0 $5
srl $3 $2 4
lui $5 0x0800
ori $5 $0 0x0000
bne $3 $5 fail
addu $0 $0 $0 #Nop
.data
srlv_: .asciiz "Testing SRLV\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 srlv_
lui $a0, 0x1000
ori $a0 $a0 0x223
syscall
addi $2 $0 1
addi $4 $0 0
srlv $3 $2 $4
ori $5 $0 1
bne $3 $5 fail
addi $4 $0 1
srlv $3 $2 $4
bne $3 $0 fail
addi $2 $0 0x1000
addi $4 $0 4
srlv $3 $2 $4
ori $5 $0 0x100
bne $3 $5 fail
lui $5 0x8000
ori $5 $5 0x0000
add $2 $0 $5
addi $4 $0 4
srlv $3 $2 $4
lui $5 0x0800
ori $5 $5 0x0000
bne $3 $5 fail
addu $0 $0 $0 # Nop
.data
sub_: .asciiz "Testing SUB\n"
# sub1_: .asciiz "Expect an overflow exceptions:\n "
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sub_
lui $a0, 0x1000
ori $a0 $a0 0x231
syscall
addi $2 $0 1
addi $3 $0 -1
sub $4, $0, $0
bne $4 $0 fail
sub $4, $0, $2
addi $5 $0 -1
bne $4 $5 fail
sub $4, $2, $0
ori $5 $0 1
bne $4, $5 fail
sub $4, $2, $3
ori $5 $0 2
bne $4, $5 fail
sub $4, $3, $2
addi $5 $0 -2
bne $4, $5 fail
addu $0 $0 $0 # Nop
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sub1_
# syscall
# addi $2 $0 0x80000000
# addi $3 $0 1
# sub $4, $3, $2
.data
subu_: .asciiz "Testing SUBU\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 subu_
lui $a0, 0x1000
ori $a0 $a0 0x23e
syscall
addi $2 $0 1
addi $3 $0 -1
subu $4, $0, $0
bne $4 $0 fail
subu $4, $0, $2
addi $5 $0 -1
bne $4 $5 fail
subu $4, $2, $0
addi $5 $0 1
bne $4, $5 fail
subu $4, $2, $3
addi $5 $0 2
bne $4, $5 fail
subu $4, $3, $2
addi $5 $0 -2
bne $4, $5 fail
lui $5 0x8000
ori $5 $5 0x0000
add $2 $0 $5
addi $3 $0 1
subu $4, $3, $2
.data
sw_: .asciiz "Testing SW\n"
#sw2_: .asciiz "Expect two address error exceptions:\n "
.align 2
swd_: .byte 0, 0, 0, 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sw_
lui $a0, 0x1000
ori $a0 $a0 0x24c
syscall
# addi $3 $0, 0x7f7f7f7f
lui $3 0x7f7f
ori $3 $3 0x7f7f
# la $2 swd_
lui $2, 0x1000
ori $2 $2 0x258
sw $3 0($2)
lw $4 0($2)
lui $5 0x7f7f
ori $5 $5 0x7f7f
bne $4 $5 fail
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 sw2_
# syscall
#
# sw $3 1000000($sp)
# sw $3 1000001($sp)
.data
swl_: .asciiz "Testing SWL\n"
.align 2
swld_: .word 0 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 swl_
lui $a0, 0x1000
ori $a0 $a0 0x25c
syscall
# la $2 swld_
lui $2, 0x1000
ori $2 $2 0x26c
# addi $3 $0 0x01000000
lui $3 0x0100
ori $3 $3 0x0000
swl $3 0($2)
lw $4 0($2)
ori $5 $0 0x1
bne $4 $5 fail
# addi $3 $0 0x01020000
lui $3 0x0102
ori $3 $3 0x0000
swl $3 1($2)
lw $4 0($2)
ori $5 $0 0x0102
bne $4 $5 fail
# addi $3 $0 0x01020300
lui $3 0x0102
ori $3 $3 0x0300
swl $3 2($2)
lw $4 0($2)
lui $5 0x01
ori $5 $5 0x0203
bne $4 $5 fail
# addi $3 $0 0x01020304
lui $3 0x0102
ori $3 $3 0x0304
swl $3 3($2)
lw $4 0($2)
lui $5 0x0102
ori $5 $5 0x0304
bne $4 $5 fail
addu $0 $0 $0 # Nop
.data
swr_: .asciiz "Testing SWR\n"
.align 2
swrd_: .word 0 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 swr_
lui $a0, 0x1000
ori $a0 $a0 0x274
syscall
# la $2 swrd_
lui $2, 0x1000
ori $2 $2 0x284
addi $3 $0 1
swr $3 0($2)
lw $4 0($2)
ori $5 $0 1
bne $4 $5 fail
addi $3 $0 0x0102
swr $3 1($2)
lw $4 0($2)
lui $5 0x1
ori $5 $5 0x0201
bne $4 $5 fail
# addi $3 $0 0x010203
lui $3 0x01
ori $3 $3 0x0203
swr $3 2($2)
lw $4 0($2)
lui $5 0x203
ori $5 $5 0x0201
bne $4 $5 fail
# addi $3 $0 0x01020304
lui $3 0x0102
ori $3 $3 0x0304
swr $3 3($2)
lw $4 0($2)
lui $5 0x403
ori $5 $5 0x0201
bne $4 $5 fail
addu $0 $0 $0 #Nop
.data
xor_: .asciiz "Testing XOR\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 xor_
lui $a0, 0x1000
ori $a0 $a0 0x28c
syscall
addi $2 $0 1
addi $3 $0 -1
xor $4 $0 $0
bne $4 $0 fail
xor $4 $3 $3
bne $4 $0 fail
xor $4 $2 $3
lui $5 0xffff
ori $5 $5 0xfffe
bne $4 $5 fail
addu $0 $0 $0 #Nop
.data
xori_: .asciiz "Testing XORI\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 xori_
lui $a0, 0x1000
ori $a0 $a0 0x299
syscall
addi $2 $0 1
ori $3 $0 -1
xori $4 $0 0
bne $4 $0 fail
xori $4 $3 -1
bne $4 $0 fail
xori $4 $2 -1
# lui $5 0xffff
ori $5 $0 0xfffe
bne $4 $5 fail
.data
jal_: .asciiz "Testing JAL\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 jal_
lui $a0, 0x1000
ori $a0 $a0 0x2a7
syscall
jal l18
addu $0 $0 $0 # Nop
l19: j l20 # 0x00400ea0
addu $0 $0 $0 # Nop
l18: lui $4 0x0040 # to replace la $4 l19
ori $4 $4 0x0eb0 # bare machine has a delay slot.
bne $31 $4 fail
addu $0 $0 $0 #Nop
jr $31
addu $0 $0 $0 #Nop
l20: addu $0 $0 $0 #Nop -- 0x00400ebc
.data
jalr_: .asciiz "Testing JALR\n"
#jalr2_: .asciiz "Expect an non-word boundary exception:\n "
.text
addi $v0 $0 4 # syscall 4 (print_str) 0x00400ec0
# la $a0 jalr_
lui $a0, 0x1000
ori $a0 $a0 0x2b4
syscall
# la $2 l21
lui $2 0x0040 # 0x00400ed0
ori $2 $2 0x0ef4
addu $4 $0 $2
jalr $3, $2
addu $0 $0 $0 #Nop -- 00400ee0
l23: j l22
l21: addu $0 $0 $0 # la $4 l21 -- delay slot.
bne $3 $4 fail
addu $0 $0 $0 # Nop -- 00400ef0
jr $3
l22: addu $0 $0 $0 # Nop
# li $v0 4 # syscall 4 (print_str)
# la $a0 jalr2_
# syscall
# la $2 l24
# add $2 $2 2
# l24: jalr $3 $2
.data
bgezal_:.asciiz "Testing BGEZAL\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bgezal_
lui $a0, 0x1000 # 00400f00
ori $a0 $a0 0x2c2
syscall
addi $2 $0 -1
addi $3 $0 1 # 00400f10
bgezal $0 l5
addu $0 $0 $0 # Nop
j fail
addu $0 $0 $0 # Nop -- 00400f20
l5: bgezal $2 fail
addu $0 $0 $0 # Nop
bgezal $3 l6
addu $0 $0 $0 # Nop -- 00400f30
l55: j fail
addu $0 $0 $0 # Nop
l6: lui $4 0x0040 # la $4 l55
ori $4 $4 0x0f48 # 00400f40
bne $31 $4 fail
addu $0 $0 $0 # Nop
.data
bltzal_:.asciiz "Testing BLTZAL\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 bltzal_
lui $a0, 0x1000 # 00400f50
ori $a0 $a0 0x2d2
syscall
addi $2 $0 -1
addi $3 $0 1 # 00400f60
bltzal $0 fail
addu $0 $0 $0 # Nop
bltzal $3 fail
addu $0 $0 $0 # Nop -- 00400f70
l13: bltzal $2 l15
addu $0 $0 $0 # Nop
l14: j fail
addu $0 $0 $0 # Nop -- 00400f80
l15: lui $4 0x0040 # la $4 l14
ori $4 $4 0x0f90
bne $31 $4 fail
addu $0 $0 $0 # Nop -- 00400f90
# Testing the exceptions
.data
break_: .asciiz "Testing BREAK\nExpect an exception message:\n "
# .text
# addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 break_
# lui $a0, 0x1000
# ori $a0 $a0 0x2e2
# syscall
# break 3
.data
ccp_: .asciiz "Testing move to/from coprocessor control z\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 ccp_
lui $a0, 0x1000
ori $a0 $a0 0x310
syscall
# li $2 0x7f7f
addi $2 $0 0x7f7f
ctc0 $2 $3
addu $0 $0 $0 #Nop
cfc0 $4 $3
addu $0 $0 $0 #Nop
bne $2 $4 fail
# li $2 0x7f7f
# Skip floating point stuff for now.
# addi $2 $0 0x7f7f
# ctc1 $2 $3
# addu $0 $0 $0 #Nop
# cfc1 $4 $3
# addu $0 $0 $0 #Nop
# bne $2 $4 fail
# li $2 0x7f7f
addi $2 $0 0x7f7f
ctc2 $2 $3
addu $0 $0 $0 #Nop
cfc2 $4 $3
addu $0 $0 $0 #Nop
bne $2 $4 fail
# li $2 0x7f7f
addi $2 $0 0x7f7f
ctc3 $2 $3
addu $0 $0 $0 #Nop
cfc3 $4 $3
addu $0 $0 $0 #Nop
bne $2 $4 fail
addu $0 $0 $0 # Nop
.data
mcp_: .asciiz "Testing move to/from coprocessor z\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 mcp_
lui $a0, 0x1000
ori $a0 $a0 0x33c
syscall
# li $2 0x7f7f
addi $2 $0 0x7f7f
mtc0 $2 $3
addu $0 $0 $0 # Nop
mfc0 $4 $3
addu $0 $0 $0 # Nop
bne $2 $4 fail
# Skip FP for now.
# li $2 0x7f7f
# addi $2 $0 0x7f7f
# mtc1 $2 $3
# addu $0 $0 $0 # Nop
# mfc1 $4 $f3
# addu $0 $0 $0 # Nop
# bne $2 $4 fail
# li $2 0x7f7f
# addi $2 $0 0x7f7f
# li $3 0xf7f7
# addi $3 $0 0x7f7f
# mtc1.d $2 $4
# mfc1.d $6 $4
# bne $2 $6 fail
# bne $3 $7 fail
# li $2 0x7f7f
addi $2 $0 0x7f7f
mtc2 $2 $3
addu $0 $0 $0 # Nop
mfc2 $4 $3
addu $0 $0 $0 # Nop
bne $2 $4 fail
# li $2 0x7f7f
addi $2 $0 0x7f7f
mtc3 $2 $3
addu $0 $0 $0 # Nop
mfc3 $4 $3
addu $0 $0 $0 # Nop
bne $2 $4 fail
addu $0 $0 $0 # Nop
.data
hilo_: .asciiz "Testing move to/from HI/LO\n"
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 hilo_
lui $a0, 0x1000
ori $a0 $a0 0x360
syscall
mthi $0
mfhi $2
bne $2 $0 fail
mtlo $0
mflo $2
bne $2 $0 fail
# li $2 1
addi $2 $0 1
mthi $2
mfhi $3
bne $3 $2 fail
# li $2 1
addi $2 $0 1
mtlo $2
mflo $3
bne $3 $2 fail
# li $2 -1
addi $2 $0 -1
mthi $2
mfhi $3
bne $3 $2 fail
# li $2 -1
addi $2 $0 1
mtlo $2
mflo $3
bne $3 $2 fail
addu $0 $0 $0 # Nop
.data
lswc_: .asciiz "Testing load/store word coprocessor z\n"
.align 2
lswcd_: .byte 0, 0, 0, 0
.text
addi $v0 $0 4 # syscall 4 (print_str)
# la $a0 lswc_
lui $a0, 0x1000
ori $a0 $a0 0x37c
syscall
# li $3, 0x7f7f7f7f
lui $3 0x7f7f
ori $3 $3 0x7f7f
# la $2 lswcd_
lui $2, 0x1000
ori $2 $2 0x3a4
mtc0 $3, $0
addu $0 $0 $0 #Nop
swc0 $0 0($2)
lw $4 0($2)
addu $0 $0 $0 #Nop
bne $4 $3 fail
lwc0 $1 0($2)
addu $0 $0 $0 #Nop
mfc0 $5, $1
addu $0 $0 $0 #Nop
bne $5 $3 fail
addu $0 $0 $0 #Nop
# li $3, 0x7f7f7f7f
# lui $3 0x7f7f
# ori $3 $3 0x7f7f
# la $2 lswcd_
# lui $2, 0x1000
# ori $2 $2 0x3a4
# mtc1 $3, $0
# addu $0 $0 $0 #Nop
# swc1 $f0 0($2)
# lw $4 0($2)
# addu $0 $0 $0 #Nop
# bne $4 $3 fail
# lwc1 $f1 0($2)
# addu $0 $0 $0 #Nop
# mfc1 $5, $f1
# addu $0 $0 $0 #Nop
# bne $5 $3 fail
# li $3, 0x7f7f7f7f
lui $3 0x7f7f
ori $3 $3 0x7f7f
# la $2 lswcd_
lui $2, 0x1000
ori $2 $2 0x3a4
mtc2 $3, $0
addu $0 $0 $0 #Nop
swc2 $0 0($2)
lw $4 0($2)
addu $0 $0 $0 #Nop
bne $4 $3 fail
lwc2 $1 0($2)
addu $0 $0 $0 #Nop
mfc2 $5, $1
addu $0 $0 $0 #Nop
bne $5 $3 fail
addu $0 $0 $0 #Nop
# li $3, 0x7f7f7f7f
lui $3 0x7f7f
ori $3 $3 0x7f7f
# la $2 lswcd_
lui $2, 0x1000
ori $2 $2 0x3a4
mtc3 $3, $0
addu $0 $0 $0 #Nop
swc3 $0 0($2)
lw $4 0($2)
addu $0 $0 $0 #Nop
bne $4 $3 fail
addu $0 $0 $0 #Nop
lwc3 $1 0($2)
addu $0 $0 $0 #Nop
mfc3 $5, $1
addu $0 $0 $0 #Nop
bne $5 $3 fail
addu $0 $0 $0 #Nop
# Done !!!
.data
pt: .asciiz "Passed all tests\n"
.text
addi $2 $0 4 # syscall 4 (print_str)
# la $a0 sm
lui $a0, 0x1000
ori $a0 $a0 0x3a8
syscall
lui $4 0x1000
lw $31 0($4)
addu $0 $0 $0 # Nop
jr $31 # Return from main
# .data
#fm: .asciiz "Failed test\n"
.text
fail: addi $2 $0 4 # syscall 4 (print_str)
# la $a0 fm
lui $a0, 0x1000
ori $a0 $a0 0x4
syscall
addi $2 $0 10 # syscall 10 (exit)
syscall
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
addu $0 $0 $0 # Nop
# Define the exception handling code. This must go first!
# Duplicate of standard trap handler.
.data
.globl __m1_
__m1_: .asciiz " Exception "
.globl __m2_
__m2_: .asciiz " occurred\n"
.ktext 0x80000080
mfc0 $26 $13 # Cause
mfc0 $27 $14 # EPC
addiu $v0, $0, 4 # syscall 4 (print_str)
# la $a0 __m1_
lui $a0, 0x1000
ori $a0 $a0 0x03e5
syscall
addiu $v0, $0, 1 # syscall 1 (print_int)
addu $a0 $0 $26
syscall
addiu $v0, $0, 4 # syscall 4 (print_str)
# la $a0 __m2_
lui $a0, 0x1000
ori $a0, $a0, 0x03f1
syscall
mtc0 $0, $13 # Clear Cause register
rfe # Return from exception handler
addiu $27 $27 4 # Return to next instruction
jr $27